У Барыша есть n собак и m обезьян. Он хочет выстроить их в одну линию. Но он не хочет,
чтобы в каком-либо месте стояло подряд две собаки или две обезьяны, потому что
в таком случае они начинают драться. Сколько существует различных вариантов
построения, таких чтобы ни обезьяны, ни собаки не дрались. Ответ выведите по
модулю 109 + 7. Имейте в виду, что собаки и обезьяны между
собой различаются.
Вход.
Два числа n и m (1 ≤ n, m ≤ 105).
Выход.
Выведите количество различных вариантов построения обезьян и собак по
модулю 109 + 7.
Пример входа 1 |
Пример выхода 1 |
2 2 |
8 |
|
|
Пример входа 2 |
Пример выхода 2 |
3 2 |
12 |
|
|
Пример входа 3 |
Пример выхода 3 |
1 8 |
0 |
комбинаторика
Если m > n +
1
или m < n – 1, то требуемой расстановки не существует, ответ 0.
Если m = n, то собак и обезьян следует
расположить чередуя друг с другом. Например, на четных местах можно поставить
собак (n! вариантов,
так как все собаки различные), на нечетных – обезьян (m! вариантов, обезьяны различные).
Аналогично можно на нечетных
местах поставить собак, а на четных обезьян. Итого при m = n имеем 2 * n! * m! вариантов.
Если собак
на 1 больше обезьян (или соответственно обезьян на 1 больше чем собак), то
количество вариантов их расположения равно n! * m!
Реализация алгоритма
Вычисления следует проводить
по модулю MOD = 109 + 7.
#define MOD 1000000007
Функция fact вычисляет факториал n!
long long fact(int n)
{
long long res = 1;
for (int i = 2; i <=
n; i++)
res = (res * i)
% MOD;
return res;
}
Читаем входные данные.
scanf("%d %d", &m, &n);
Если собак на 2 больше чем обезьян или обезьян на 2 больше чем собак,
то такая расстановка невозможна.
if (m > n + 1 || m < n
- 1)
res = 0;
Если собак и обезьян одинаковое количество.
else if (m == n)
res = (fact(n)
* fact(n) * 2) % MOD;
else
Если собак на 1 больше чем обезьян или обезьян на 1 больше чем собак.
res = (fact(n)
* fact(m)) % MOD;
Выводим ответ.
printf("%lld\n", res);